import calendar  # 导入Python内置的calendar模块，用于处理日历相关功能
import storage_manager  # 导入自定义的storage_manager模块，用于管理事件的存储和加载

def format_month_calendar_text(year, month, event_dates_in_month):
    """
    格式化指定年份和月份的日历文本，并在有事件的日期上添加标记。

    参数:
        year (int): 年份
        month (int): 月份
        event_dates_in_month (set): 该月中有事件的日期集合

    返回:
        str: 格式化后的日历文本字符串
    """
    month_calendar = calendar.monthcalendar(year, month)  # 获取指定年月的日历，返回一个二维列表，每个子列表代表一周
    calendar_text = "-" * 28  # 生成日历顶部的分隔线
    calendar_text += f"\n\t  \t  {year}年 {month}月"  # 添加年份和月份标题
    calendar_text += "\n 一   二  三  四   五  六   日"  # 添加星期标题
    for week in month_calendar:
        week_str = ""  # 初始化每周的字符串
        for day in week:
            if day == 0:  # 0表示该月不包含此日期（如上个月的日期）
                week_str += "    "  # 用空格填充
            elif day in event_dates_in_month:  # 如果日期在事件集合中
                week_str += f"[{day:2}]"  # 用方括号标记该日期
            else:
                week_str += f" {day:2} "  # 普通日期的格式
        calendar_text += "\n" + week_str  # 将每周的字符串添加到日历文本中
    calendar_text += "\n" +  "-" * 28  # 生成日历底部的分隔线
    return calendar_text  # 返回完整的日历文本

def get_event_dates_for_month(year, month, all_events):
    """
    获取指定年月所有事件的日期（仅日期部分，不包含年月）。

    参数:
        year (int): 年份
        month (int): 月份
        all_events (list): 所有事件的列表，每个事件是一个字典

    返回:
        set: 包含该月所有事件日期的集合（日期为整数）
    """
    event_dates = set()  # 使用集合来存储日期，自动去重
    for event in all_events:
        event_date = event["date"]  # 获取事件的日期字符串，格式如 "2023-10-15"
        if event_date.startswith(f"{year}-{month:02d}-"):  # 检查事件日期是否属于指定年月
            # 提取日期部分并转换为整数
            day = int(event_date.split("-")[-1])  # 使用split分割字符串，取最后一部分（日期），并转为int
            event_dates.add(day)  # 将日期添加到集合中
    return event_dates  # 返回包含所有事件日期的集合

def display_month_calendar_interaction():
    """
    与用户交互，获取年份和月份，并显示该月的日历。
    包含输入验证和错误处理。
    """
    try:
        year = int(input("请输入年份："))  # 获取用户输入的年份，并尝试转换为整数
        month = int(input("请输入月份："))  # 获取用户输入的月份，并尝试转换为整数
        if month < 1 or month > 12:  # 检查月份是否在有效范围内
            print("月份必须在1到12之间！")
            return  # 如果月份无效，打印错误信息并退出函数
        all_events = storage_manager.load_all_events_from_file()  # 从文件加载所有事件
        event_dates = get_event_dates_for_month(year, month, all_events)  # 获取该月的事件日期集合
        calendar_text = format_month_calendar_text(year, month, event_dates)  # 格式化日历文本
        print(calendar_text)  # 打印格式化后的日历
    except ValueError:  # 捕获用户输入非数字时引发的ValueError异常
        print("输入格式错误，请输入有效的数字！")  # 打印错误信息

# 仅用于测试，实际使用时应由main.py调用
if __name__ == "__main__":
    display_month_calendar_interaction()  # 如果直接运行此文件，则调用交互函数进行测试
